#include "MainJuegoLocal.h"
#include <iostream>
#include "../common/AdministradorDeNiveles.h"

#include "MenuPuntos.h"

MainJuegoLocal::MainJuegoLocal()
{
	Glib::RefPtr<Gtk::Builder> refBuilder = Gtk::Builder::create();
	refBuilder->add_from_file("./Cliente/Juego.glade");
	refBuilder->get_widget("Juego", main);

	estadoConexion = false;
	esMultijugador = false;
	Canvas *pC = &c;
	hookClick(pC);
}

MainJuegoLocal::MainJuegoLocal(std::string ip, int puerto )
{
	this->esMultijugador = true;
	Glib::RefPtr<Gtk::Builder> refBuilder = Gtk::Builder::create();
	refBuilder->add_from_file("./Cliente/Juego.glade");
	refBuilder->get_widget("Juego", main);
		
	Canvas *pC = &c;
	estadoConexion = false;
	if (esMultijugador){
		try{
		cliente = new Cliente (pC, ip.c_str(), puerto);
		estadoConexion = true;
		}
		catch(int)
		{
			estadoConexion = false;
		}	
	}
	hookClick(pC);
}

bool MainJuegoLocal::getEstadoConexion(){
	return estadoConexion;
}


MainJuegoLocal::~MainJuegoLocal()
{
}

void MainJuegoLocal::handlerClick(Punto* p) {
	if (esMultijugador) cliente->lanzarHuevo(p->getX(),p->getY());
	else partida->lanzarHuevo(p->getX(),p->getY());
}

void MainJuegoLocal::hookClick(Canvas* canvas) {
	canvas->eventoClick.connect(sigc::mem_fun(*this, &MainJuegoLocal::handlerClick)); 
}

void MainJuegoLocal::crearPartidaLocal(short nivel) {
	AdministradorDeNiveles admin;

	if (!esMultijugador){
		Canvas *pC = &c;
		partida = new PartidaLocal (pC,true);
		partida->getJuego()->cargarNivel(admin.instanciarNivel(nivel,1));
		nivelEnCurso = nivel;
		partida->iniciar();
		hookEvent(partida->getJuego());
		c.show_all();
		main->add(c);
		c.Start();
		Gtk::Main::run(*main);
		c.Stop();
		
			MenuPuntos m;
			m.correr(resultado,partida->getJuego()->getPuntos());
	
		delete(partida);
	}
}
void MainJuegoLocal::crearPartidaMultijugador(short nivel, short cantidadDeJugadores){
	if (esMultijugador){
		nivelEnCurso = nivel;
		cliente->crearPartida(nivel, cantidadDeJugadores);
		hookEvent(cliente->getPartida()->getJuego());
		c.show_all();
		main->add(c);
		c.start();
		Gtk::Main::run(*main);
		c.Stop();
		delete(cliente);
	}
}
void MainJuegoLocal::unirsePartidaMultijugador(short id,short nivel){
		if (esMultijugador){
		cliente->unirseAPartida(id);
		nivelEnCurso = nivel;
		hookEvent(cliente->getPartida()->getJuego());
		c.show_all();
		main->add(c);
		c.start();
		Gtk::Main::run(*main);
		c.Stop();		
		delete(cliente);
	}
}

std::vector<short> MainJuegoLocal::getPartidas(){
	return cliente->getPartidas();
}

void MainJuegoLocal::hookEvent(Juego* pSource) {
	pSource->eventoPerdida.connect(sigc::mem_fun(*this, &MainJuegoLocal::handlerPerdida));
	pSource->eventoGanada.connect(sigc::mem_fun(*this, &MainJuegoLocal::handlerGanada));
}

void MainJuegoLocal::handlerGanada(short nada) {
	resultado = "GANO";
	AdministradorDeNiveles admin;
	admin.habilitarNivel(++nivelEnCurso);		
	main->hide();
}

void MainJuegoLocal::handlerPerdida(short nada) {
	resultado = "PERDIO";
	main->hide();
}
